package com.haidechizi.i18n.code.generator.common.propconvert.generator;

import com.alibaba.fastjson.JSON;
import com.haidechizi.i18n.code.generator.common.message.utils.FileUtils;
import com.haidechizi.i18n.code.generator.common.message.utils.RegexUtils;
import com.haidechizi.i18n.code.generator.common.propconvert.param.PropConvertConfig;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author wangdejun
 * @create 2020/10/17 17:34
 */
public class VueGenerator extends BasePropGenerator {

    /**
     * 解析静态资源文件，提取国际化数据
     *
     * @param propConvertConfig 参数
     * @return
     */
    @Override
    protected Map<String, String> generatorMessage(PropConvertConfig propConvertConfig) {
        String regex = "handle[\\s]*=[\\s]*(\\{[\\s\\S]*});";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(FileUtils.readFile(propConvertConfig.getFilePath()));
        if (matcher.find()) {
            String content = matcher.group(1);
            try {
                Map<String, String> map = JSON.parseObject(content, Map.class);
                return map;
            } catch (Exception e) {
                throw new RuntimeException("国际化属性资源文件解析失败");
            }
        }
        throw new RuntimeException("国际化属性资源文件格式无法解析");
    }

    /**
     * 类型名称
     *
     * @return
     */
    @Override
    public String type() {
        return "VUE";
    }

    /**
     * 判断是否支持当前类型文件的操作
     *
     * @param suffix
     * @return
     */
    @Override
    public boolean support(String suffix) {
        return "js".equals(suffix);
    }

    /**
     * 生成替换资源文件的正则表达式
     *
     * @param regex
     * @param messageEntry
     * @return
     */
    @Override
    protected String generatorReplaceRegex(String regex, Map.Entry<String, String> messageEntry) {
        return "['\"]" + RegexUtils.parseRegex(messageEntry.getKey()) + "['\"]" + "(\\s)*:(\\s)*" + "['\"]" + regex + "['\"]";
    }

    /**
     * 生成替换的内容
     *
     * @param messageEntry
     * @return
     */
    @Override
    protected String generatorReplaceData(Map.Entry<String, String> messageEntry) {
        return "'" + messageEntry.getKey() + "'" + ":" + "'" + messageEntry.getValue() + "'";
    }

    /**
     * 后置处理，处理新生成的资源文件的内容
     *
     * @param propConvertConfig
     * @param content
     * @param language
     * @return
     */
    @Override
    protected String afterGenerator(PropConvertConfig propConvertConfig, String content, String language) {
        return content.replaceAll(propConvertConfig.getCurrentLanguage(), language);
    }
}
